# 返回函数

# 高阶函数除了可以接受函数作为参数外，还可以把函数作为结果返回(相当于返回值是一个函数)
def lazy_sum(*args):
    def sum():
        ax = 0
        for n in args:
            ax = ax +n
        return ax
    return sum
f = lazy_sum(1, 3, 5, 7, 9)
print(f) # <function lazy_sum.<locals>.sum at 0x00000266ADFD4D60>
print(f()) # 25


# 闭包
'''
闭包函数的三个特点(三要素)：
1、嵌套函数：一个函数定义了另外一个函数
2、引用外部变量：内部函数使用了外部函数的变量
3、返回内部函数：外部函数返回了内部函数本身(注意：返回的是内部函数名)

返回闭包时牢记一点：返回函数不要引用任何循环变量，或者后续会发生变化的变量。
'''
def outer(x):
    def inner(y):
        return x+y
    return inner
# 调用闭包函数
ou = outer(2)
print(ou(3)) # 输出结果：5

'''
在 Python 中，nonlocal 是一个关键字，用于在嵌套函数中修改外层（但不是全局）作用域的变量。

你可以把 nonlocal 理解为：
“我不是全局变量，也不是我自己定义的局部变量，我是外面一层函数定义的变量，我想改它。”
'''
# 举个例子
def outer2():
    x = 10
    def inner():
        nonlocal x
        x = 20
    inner()
    print(x)

outer2()  # 输出：20